package com.bright.hxj.cwduijie.service;

import com.bright.hxj.cwduijie.enums.DataApi;
import com.bright.hxj.cwduijie.pojo.command.*;
import com.bright.hxj.cwduijie.pojo.dto.PageDTO;
import com.bright.hxj.cwduijie.pojo.po.DuijieProcLog;
import com.bright.hxj.cwduijie.pojo.query.DuijieQuery;
import com.bright.hxj.cwduijie.pojo.query.PageQuery;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @Author hxj
 * @Date 2024/7/4 15:31
 * @Description
 */

public interface DuijieService {

    /**
     * 主方法
     */
    void duijie() throws JsonProcessingException;

    void duijie(DuijieCommand duijieCommand) throws JsonProcessingException;

    /**
     * 存储过程生成数据
     */
    void build(BuildCommand buildCommand);

    void buildOneAndStartOne(BuildCommand buildCommand, DuijieCommand duijieCommand) throws JsonProcessingException;

    /**
     * 请求第三方接口刷新异步任务状态执行情况
     */
    void checkAsyncTasks();

    /**
     * 启动下一批次数据
     */
    void startNextBatch();

    /**
     *  全部接口一次性推送 不分批 遂溪、麻章特殊(现在全都是这种了)
     * @param duijieCommand
     * @throws JsonProcessingException
     * @return 成功信息
     */
    String startByOnlyOneBatch(DuijieCommand duijieCommand) throws JsonProcessingException;

    void checkBatchIfAllEnd();

    void test(Integer accSet);

    /**
     * 获取需要对接的账套号 排除掉还有在等待结果中数据的账套
     * @return
     */
    String[] getNeedDuijieAccSetsExceptExecuting();

    void deleteDataKeys(String serviceCode) throws JsonProcessingException;


    /**
     * 对接附件
     * @param duijieQuery 查询附件条件
     * @param batchId     批次
     */
    void sendFiles(DuijieQuery duijieQuery, String batchId);


    /**
     * 删除附件
     * @param duijieQuery 查询附件条件
     * @param batchId     批次
     */
    void deleteFiles(DuijieQuery duijieQuery, String batchId);

    // 20240726 另外开一个定时任务 查还没更新到中间表的异步任务的状态
    void syncTaskResultToDataTables();

    /**
     * 凭证冲洗 传默认科目上去把原来凭证分录的科目覆盖掉
     * @param commands
     * @throws JsonProcessingException
     */
    void sendVoucherWithDefaultVoucherEntry(List<SendDefaultVoucherEntryCommand> commands) throws JsonProcessingException;

    /**
     * 指定更新哪些id的数据交换标志
      */
    void updateSjjhbzByServiceCodeAndIds(UpdateOpTypeSjjhbzCommand command, DataApi dataApi);

    /**
     * v1.6.7 处理凭证报错 账套[44-xx]当前启用的会计期间是[2024年1月]，参数中传入的凭证会计期间是[2024年2月]：一个账套下的凭证必须属于同一个当前启用或已月结的会计期间
      */
    void processVoucherError(ProcessVoucherErrorCommand command) throws JsonProcessingException;

    /**
     * 调用自动推送月结批次数据
     * @param pushCommand
     */
    void pushMonthDataOrderByMonthByBatch(PushMonthDataByBatchCommand pushCommand);

    /**
     * 识别固定资产报错 把正确的另外再发送上去
     */
    void autoProcessFixedAssetsError();

    /**
     * v1.8.1 对接到测试环境 用于调试接口
     * @param duijieCommand
     */
    String generateRandomJsonString(TestEnvDuijieCommand duijieCommand);

    /**
     * v1.8.1 对接到测试环境 用于调试接口
     * @param duijieCommand
     */
    void duijieToTestEnv(TestEnvDuijieCommand duijieCommand, MultipartFile file);

    void buildWithProc(BuildWithProcCommand command);

    PageDTO<DuijieProcLog> getProcLogs(PageQuery duijieQuery);
}
